﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HotelManagement._04.OBJECT;
using HotelManagement._02.BUS;
using HotelManagement;

namespace HotelManagement._01.FORM
{
    public partial class F26_CheckIn : Form
    {
        CheckIn m_CheckIn;// biến dùng cho checkIn khi đã đặt phòng trước
        CheckIn m_CheckIn1;// biến dùng cho checkIn đặt phòng mơi
        CheckInBUS m_CheckInBUS;// dùng để xử lí dữ liệu( tất cả các biến có chứ BUS ở cuôi
        ReservationBUS m_ReservationBUS;
        public F26_CheckIn()
        {
            InitializeComponent();// khởi tạo from
            Init();// khởi tạo đối tượng
            LoadDataToGrid();// load dữ liệu từ CSDL vào grid
        }

        public void Init()// khởi tạo đối tượng
        {
            m_CheckIn = new CheckIn();
            m_CheckInBUS = new CheckInBUS();
            m_CheckIn1 = new CheckIn();
            m_ReservationBUS = new ReservationBUS();

        }

        public void LoadDataToGrid()// lấy dữ liệu đưa vào grid
        {
            DateTime v_datetimeNow = DateTime.Now;
            m_dvg_RoomInfo.DataSource = m_CheckInBUS.ViewRoomStatus();// lấy các room có status= empty hoặc status = booked đưa vào grid phần đặt phòng mới
            m_dgv_Reservation.DataSource = m_CheckInBUS.ViewReservation(v_datetimeNow);// lấy danh sách các đặt phòng mới chưa được checkIn đưa vào grid đặt phòng khi đã đặt trước
            m_cbo_RoomID.DataSource = m_CheckInBUS.ViewRoomStatus();//lấy danh sách các phòng đưa vào combobox
            m_cbo_RoomID.DisplayMember = "RoomID";
            m_cbo_RoomID.ValueMember = "RoomID";
        }

        private void m_dgv_Reservation_CellClick(object sender, DataGridViewCellEventArgs e)// bắt sự kiện khi click vào 1 dòng trên grid checkIn khi đã đặt trước
        {
            try
            {
                m_CheckIn.CustomerID = int.Parse(m_dgv_Reservation.Rows[m_dgv_Reservation.CurrentCell.RowIndex].Cells["CustomerID"].Value.ToString());//lấy CustomerID của dòng đc Click
                m_CheckIn.RoomID = m_dgv_Reservation.Rows[m_dgv_Reservation.CurrentCell.RowIndex].Cells["Room"].Value.ToString();//lấy RoomID
                m_CheckIn.CheckInDate = DateTime.Parse(m_dgv_Reservation.Rows[m_dgv_Reservation.CurrentCell.RowIndex].Cells["ArrivalDate"].Value.ToString());//Lấy ngày checkIn
                m_CheckIn.ReservationID = int.Parse(m_dgv_Reservation.Rows[m_dgv_Reservation.CurrentCell.RowIndex].Cells["ReservationID"].Value.ToString());//lấy ngày đặt phòng
                m_CheckIn.DepositCost = int.Parse(m_dgv_Reservation.Rows[m_dgv_Reservation.CurrentCell.RowIndex].Cells["DepositCost"].Value.ToString());// lấy số tiền đã đặt trước

                DataTable v_dt = m_CheckInBUS.ViewInfoCustomer(m_CheckIn);// lấy thông tin của khách hàng đã được chọn đưa vào các textbox về thông tin khách hàng

                m_txt_Tab1_CustomerName.Text = v_dt.Rows[0][1].ToString();//hiển thị thông tin của khách hàng
                m_txt_Tab1_IDCardNo.Text = v_dt.Rows[0][8].ToString();
                m_txt_Tab1_Phone.Text = v_dt.Rows[0][6].ToString();
                m_txt_Tab1_PassportNo.Text = v_dt.Rows[0][9].ToString();
                m_txt_Tab1_Address.Text = v_dt.Rows[0][5].ToString();

                m_txt_Tab1_RoomID.Text = m_CheckIn.RoomID.ToString();
                m_time_Tab1_CheckInDate.Text = m_CheckIn.CheckInDate.ToString();

            }
            catch (Exception ex)
            {

                MessageBox.Show("Bạn chưa chọn phòng nào !");
            }
        }

        private void m_btn_Tab1_Close_Click(object sender, EventArgs e)// bắt sự kiện khi ấn núi thoát.sẽ close form
        {
            this.Close();
        }

        private void m_btn_Tab1_CheckIn_Click(object sender, EventArgs e)//sự kiện khi check in phần đã đặt trước phòng
        {
            if (m_CheckIn.RoomID == "")// khiểm tra điều kiện đầu vào
            {
                MessageBox.Show("Bạn chưa phiếu đặt phòng nào!");
            }
            else
            {
                DialogResult OK;
                OK = MessageBox.Show("Bạn muốn nhận phòng cho phiếu đặt phòng đã chọn ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);// hiện thông báo cho người dùng. yes no question
                if (OK == DialogResult.Yes)
                {
                    m_CheckIn.CheckInNote = "UnPaid";
                    m_CheckIn.ReservationNote = "1";
                    if (m_CheckInBUS.CheckInInsert(m_CheckIn) && m_CheckInBUS.CheckInRoomUpdateStatus(m_CheckIn) && m_CheckInBUS.CheckInReservationUpdateNote(m_CheckIn))  //Insert bản ghi vào bảng check in, update tình trạng phòng, update reservation note=1(tức là phiếu đặt phòng này đã được checkIn rồi)
                    {
                        MessageBox.Show("Thành công !");
                        m_CheckIn.RoomID = "";
                        LoadDataToGrid();//load lại dữ liệu vào gird
                    }
                    else MessageBox.Show("Có lỗi! Không cập nhật được.");
                }
            }
        }

        private void m_btn_Tab1_Status_Click(object sender, EventArgs e)// sự kiện khi click vào tình trạng. hiện lên form tình trạng các phòng
        {
            F33_RoomStatus v_F33_RoomStatus = new F33_RoomStatus();
            v_F33_RoomStatus.ShowDialog();
        }

        private void m_btn_Search_Click(object sender, EventArgs e)//sự kiện nút tìm kiếm. tìm kiếm theo tên khách hàng. nếu tên khách hàng có chứa kí tự giống kí tự search sẽ được hiện ra
        {
            if (m_cbo_CustomerName.Text.ToString() == "")// kiểm tra điều kiện đầu vào
            {
                MessageBox.Show("Bạn chưa nhập tên khách hàng");
            }
            else
            {
                m_CheckIn1.CustomerName = m_cbo_CustomerName.Text.ToString();//lấy teen khách hàng từ combobox
                m_cbo_CustomerName.DataSource = m_CheckInBUS.SearchCustomer(m_CheckIn1.CustomerName);//hiển thị các khách hàng tìm kiếm được vào combobox
                m_cbo_CustomerName.ValueMember = "CustomerID";
                m_cbo_CustomerName.DisplayMember = "CustomerName";
            }
        }

        private void m_cbo_CustomerName_SelectedIndexChanged(object sender, EventArgs e)//bắt sự kiện khi thay đổi đối tượng được chọn của combobox CustomerName
        {
            try
            {
                m_CheckIn1.CustomerID = int.Parse(m_cbo_CustomerName.SelectedValue.ToString().Trim());// lấy CustomerID
                DataTable v_dt = m_CheckInBUS.ViewInfoCustomer(m_CheckIn1);//lấy thông tin của khách hàng mà có CustomerID vừa được chọn từ combobox
                if (v_dt != null)//nếu khách hàng đó tồn tại. hiển thị thông tin của khách hàng đó.
                {
                    m_txt_Address.Text = v_dt.Rows[0]["Address"].ToString();
                    m_txt_IDCardNo.Text = v_dt.Rows[0]["IDCardNo"].ToString();
                    m_txt_PassPort.Text = v_dt.Rows[0]["PassportNo"].ToString();
                    m_txt_Phone.Text = v_dt.Rows[0]["Phone"].ToString();
                    //if (!CValidate.IsNullString(m_txt_IDCardNo.Text))
                    //{
                    //    if (CValidate.IsString(m_txt_IDCardNo.Text)) { MessageBox.Show("Mã số thanh toán phải là số !"); return; }
                    //}

                    //if (CValidate.IsString(m_txt_PassPort.Text)) { MessageBox.Show("Chưa nhập hoặc nhập số hộ chiếu / CMND không đúng !"); return; }

                }
            }
            catch (Exception ex)
            {

            }
        }

        private void m_btn_Close_Click(object sender, EventArgs e)// bắt sự kiện khi click nút thoát. close form
        {
            this.Close();
        }

        //private bool checkInfoRoomReservation(string ip_RoomID)
        //{
        //    DateTime v_time = DateTime.Now;
        //    DataTable v_dt = m_CheckInBUS.GetReservationByRoomID(ip_RoomID,v_time);

        //    for (int i = 0; i < v_dt.Rows.Count; i++)
        //    {
        //        DateTime v_tem = DateTime.Parse(v_dt.Rows[i]["ArrivalDate"].ToString());
        //        if (((v_tem.Year - v_time.Year) <= 0) && ((v_tem.DayOfYear - v_time.DayOfYear) < 1))
        //        {
        //            return false;
        //        }


        //    }
        //    return true;
        //}

        private void m_dvg_RoomInfo_CellClick(object sender, DataGridViewCellEventArgs e)//bắt sự kiện khi click vào 1 dòng trên grid đặt phòng mới
        {
            try
            {
                m_CheckIn1.RoomID = m_dvg_RoomInfo.Rows[m_dvg_RoomInfo.CurrentCell.RowIndex].Cells["RoomID"].Value.ToString();// lấy RoomID phòng được trọn
                DataTable v_dt = m_CheckInBUS.GetRoomTypeByRoomID(m_CheckIn1.RoomID);// lấy thông tin về phòng đã được trọn
                m_txt_RentCost.Text = v_dt.Rows[0]["Cost"].ToString();//hiển thị giá của phòng đó
                m_cbo_RoomID.Text = m_CheckIn1.RoomID;

            }
            catch (Exception ex)
            {

                MessageBox.Show("Bạn chưa chọn loại dịch vụ nào !");
            }
        }

        private void m_cbo_RoomID_SelectedIndexChanged(object sender, EventArgs e)// bắt sự kiện khi thay đổi giá trị được chọn ở combobox RoomID
        {
            try
            {
                m_CheckIn1.RoomID = m_cbo_RoomID.SelectedValue.ToString();//lấy RoomID của phòng được chọn
                DataTable v_dt = m_CheckInBUS.GetRoomTypeByRoomID(m_CheckIn1.RoomID);//lấy thông tin của phòng đó
                m_txt_RentCost.Text = v_dt.Rows[0]["Cost"].ToString();
            }
            catch
            {

            }
        }

        private void m_btn_CheckIn_Click(object sender, EventArgs e)//sự kiện khi checkIn phần đặt phòng mới
        {
            //DateTime v_reservationDate=m
            DateTime v_arrivalDate = m_time_CheckInDate.Value;//lấy ngày đến
            DateTime v_departureDate = m_Date_CheckOutDate.Value;//lấy ngày rời đi
            TimeSpan v_ts = v_arrivalDate - v_departureDate;
            if (m_CheckIn1.RoomID == "")//kiểm tra dữ liệu đầu vào
            {
                MessageBox.Show("Bạn chưa chọn phòng nào!");
            }
            else if (m_CheckIn1.CustomerID == 0)
            {
                MessageBox.Show("Bạn chưa chọn khách hàng!");
            }
            else if (m_cbo_RoomID.Text.ToString() == "")
            {
                MessageBox.Show("Bạn phải chọn phòng!");
            }
            else if (v_ts.Days>0)//kiểm tra ngày đi và ngày đến
            {

                MessageBox.Show("Ngày rời đi phải lớn hơn hoặc bằng ngày hiện tại!");
            }
            else if (CheckRevervation(m_CheckIn1.RoomID, v_arrivalDate, v_departureDate))//kiểm tra với phòng đã được chọn với ngày đến, ngày đi có thỏa mãn ko?
            {
                DialogResult OK;
                OK = MessageBox.Show("Bạn muốn nhận phòng cho phiếu đặt phòng đã chọn ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (OK == DialogResult.Yes)//nếu chọn Yes từ messageBox
                {
                    m_CheckIn1.CheckInNote = "UnPaid";
                    m_CheckIn1.CheckInDate = DateTime.Parse(m_time_CheckInDate.Text.ToString());
                    m_CheckIn1.DepositCost = 0;
                    if (m_CheckInBUS.CheckInInsert(m_CheckIn1) && m_CheckInBUS.CheckInRoomUpdateStatus(m_CheckIn1))//insert checkIn mới này vào bảng checkIn và update status của phòng đó
                    {
                        MessageBox.Show("Thành công !");
                        m_CheckIn.RoomID = "";
                        LoadDataToGrid();//load lại dữ liệu vào grid
                    }
                    else MessageBox.Show("Có lỗi! Không cập nhật được.");
                }
            }
            else
            {
                MessageBox.Show("Phòng này đã được đặt trước vào thời gian này!");
            }
        }

        private bool CheckRevervation(string roomID, DateTime arrival, DateTime departure)// hàm kiểm tra phòng đã chọn với ngày đến và ngày đi có thỏa mản ko?
        {
            DataTable v_dt;
            v_dt = m_ReservationBUS.CheckRevervation(roomID);// lấy các phòng có RoomID bằng RoomID được chọn và có ArrivalDate>= thời gian hiện tại
            if (v_dt.Rows.Count > 0)// nếu số bản ghi lớn hơn 0
            {
                if (departure < DateTime.Parse(v_dt.Rows[0]["ArrivalDate"].ToString()))//kiểm tra cho trường hợp có 1 bản ghi
                {
                    return true;

                }

                if (arrival > DateTime.Parse(v_dt.Rows[v_dt.Rows.Count - 1]["DepartureDate"].ToString()))//kiểm tra cho trường hợp có 1 bản ghi
                {
                    return true;

                }

                for (int i = 0; i < v_dt.Rows.Count - 1; i++)//kiểm tra cho trường hợp có từ 2 bản ghi trở lên
                {
                    if (arrival > DateTime.Parse(v_dt.Rows[i]["DepartureDate"].ToString()) && departure < DateTime.Parse(v_dt.Rows[i + 1]["ArrivalDate"].ToString()))
                    {
                        return true;

                    }
                }
                return false;
            }

            return true;
        }
    }
}
